package com.tsf.hbase;

import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.FilterList;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * 定义一些hbase经常操作选项
 *
 * @author taoningbo
 * @since 1.0
 */
public interface HBaseOperations {

    /**
     * 测试表中是否存在列(由Get指定)。
     * <p>
     * 如果Get匹配一个或多个键，则返回true;如果不匹配，则返回false。
     * <p>
     * 这是一个服务器端调用，因此可以防止将任何数据传输到客户机。
     *
     * @param tableName 表名称
     * @param get       用于对单行执行Get操作
     * @return 如果指定的Get匹配一个或多个键，则为true;如果不匹配，则为false
     */
    boolean exists(String tableName, Get get);

    /**
     * 测试表中是否存在列(由Gets指定)。
     * <p>
     * 这将返回一个布尔值数组。如果相关的Get匹配一个或多个键，则每个值为true，如果不匹配，则为false。
     * <p>
     * 这是一个服务器端调用，因此可以防止将任何数据传输到客户机。
     *
     * @param tableName 表名称
     * @param gets      用于对单行执行Get操作
     * @return 布尔值的数组。如果指定的Get匹配一个或多个键，则为True;如果不匹配，则为false。
     */
    boolean[] existsAll(String tableName, List<Get> gets);

    /**
     * 保存一批数据
     *
     * @param tableName 表名称
     * @param puts      待保存的一批数据
     * @return 如果保存成功返回'true'，否则返回'false'
     */
    boolean put(String tableName, List<Put> puts);

    /**
     * 保存一条数据
     *
     * @param tableName 表名称
     * @param put       待保存的一条数据
     * @return 如果保存成功返回'true'，否则返回'false'
     */
    boolean put(String tableName, Put put);

    /**
     * 获取一条数据
     *
     * @param tableName 表名称
     * @param get       用于对单行执行Get操作
     * @return 查询的单行结果
     */
    Result get(String tableName, Get get);

    /**
     * 获取多条数据
     *
     * @param tableName 表名称
     * @param gets      用于对单行执行Get操作
     * @return 查询的单行结果
     */
    Result[] get(String tableName, List<Get> gets);

    /**
     * 删除指定的单元格/行。
     *
     * @param tableName 表名称
     * @param delete    指定要删除哪些内容的对象。
     */
    void delete(String tableName, Delete delete);

    /**
     * 批量删除指定的单元格/行。
     *
     * @param tableName 表名称
     * @param deletes   要删除的内容列表。List通过这个方法进行修改(特别是它被重新排序，
     *                  因此在列表中插入元素的顺序不能保证执行{@link Delete}的顺序)。
     */
    void delete(String tableName, List<Delete> deletes);

    /**
     * 非分页扫描指定{@code tableName}表中的且只返回指定列{@code columns}的所有数据
     *
     * @param tableName 表名称
     * @param columns   指定返回这些列名的数据，key为列名称，value为列族名称
     * @param startKey  指定这个参数后，会从此位置开始扫描
     * @param endKey    指定这个参数后，会从扫描到此位置结束
     * @return 返回一个hbase的扫描结果
     */
    ResultScanner scanner(String tableName, Map<String, String> columns, byte[] startKey, byte[] endKey);

    /**
     * 非分页扫描指定{@code tableName}表中的所有数据
     *
     * @param tableName 表名称
     * @param startKey  指定这个参数后，会从此位置开始扫描
     * @param endKey    指定这个参数后，会从扫描到此位置结束
     * @return 返回一个hbase的扫描结果
     */
    ResultScanner scanner(String tableName, byte[] startKey, byte[] endKey);

    /**
     * 非分页扫描指定{@code tableName}表中的且符合过滤条件{@code filters}的所有数据
     *
     * @param tableName 表名称
     * @param startKey  指定这个参数后，会从此位置开始扫描
     * @param endKey    指定这个参数后，会从扫描到此位置结束
     * @param filters   过滤条件
     * @return 返回一个hbase的扫描结果
     */
    ResultScanner scanner(String tableName, byte[] startKey, byte[] endKey, FilterList filters);

    /**
     * 非分页扫描指定{@code tableName}表中的且列族名为{@code families}的所有数据
     *
     * @param tableName 表名称
     * @param families  这个表的所有列族名称
     * @param startKey  指定这个参数后，会从此位置开始扫描
     * @param endKey    指定这个参数后，会从扫描到此位置结束
     * @return 返回一个hbase的扫描结果
     */
    ResultScanner scanner(String tableName, Collection<String> families, byte[] startKey, byte[] endKey);

    /**
     * 非分页扫描指定{@code tableName}表中的且列族名为{@code families}的且符合过滤条件{@code filters}的所有列的数据
     *
     * @param tableName 表名称
     * @param families  这个表的所有列族名称
     * @param startKey  指定这个参数后，会从此位置开始扫描
     * @param endKey    指定这个参数后，会从扫描到此位置结束
     * @param filters   过滤条件
     * @return 返回一个hbase的扫描结果
     */
    ResultScanner scanner(String tableName, Collection<String> families, byte[] startKey, byte[] endKey, FilterList filters);

    /**
     * 分页扫描指定{@code tableName}表中的所有列的数据
     *
     * @param tableName 表名称
     * @param families  这个表的所有列族名称
     * @param pageSize  分页大小
     * @param startKey  指定这个参数后，会从此位置开始查询
     * @param endKey    指定这个参数后，会从扫描到此位置结束
     * @param startTs   过滤数据的起始时间
     * @param endTs     过滤数据的结束时间
     * @return 返回一个hbase的扫描结果
     */
    ResultScanner pageScanner(String tableName, Collection<String> families, int pageSize, byte[] startKey, byte[] endKey, Long startTs, Long endTs);

    /**
     * 分页扫描指定{@code tableName}表中的所有列数据
     *
     * @param tableName 表名称
     * @param families  这个表的所有列族名称
     * @param pageSize  分页大小
     * @param startKey  指定这个参数后，会从此位置开始查询
     * @param endKey    指定这个参数后，会从扫描到此位置结束
     * @param startTs   过滤数据的起始时间
     * @param endTs     过滤数据的结束时间
     * @param filters   过滤条件
     * @return 返回一个hbase的扫描结果
     */
    ResultScanner pageScanner(String tableName, Collection<String> families, int pageSize, byte[] startKey, byte[] endKey, Long startTs, Long endTs, FilterList filters);
}
